
package projetomsn.Server;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.Socket;
import java.net.SocketTimeoutException;
import javax.swing.JOptionPane;
/**
 * Classe que trata as conexões com os clientes 
 */
public class ServerConnectionThread implements Runnable {

    /**
     * buffer para envio de mensagens
     */
    private BufferedReader inputMessage;
    /**
     * interface de envio
     */
    private ServerInterface serverInterface;
    /**
     * quando apontar boolean falso, a thread para
     */
    private boolean keepListening = true;

    /** 
     * Construtor da classe ServerConnectionThread  
     */
    public ServerConnectionThread(ServerInterface listener, Socket clientSocket) {
        //seta uma interface pela qual as mensagens serão enviadas
        serverInterface = listener;

        try {
            //seta tempo de cinco segundos para ler mensagem do cliente
            clientSocket.setSoTimeout(5000); // five seconds

            // cria um BufferedReader para ler as mensagens que chegam
            inputMessage = new BufferedReader(new InputStreamReader(
                    clientSocket.getInputStream()));

        } catch (IOException ioException) {
            ioException.printStackTrace();
        }
    }

    /** 
     * Thread criada para receber e enviar mensagens
     */
    public void run() {
        // mensagem que chega

        String message;
        while (true) {
            try {
                message = inputMessage.readLine(); // le a mensagem do cliente
                sendMessage(message);
            } catch (SocketTimeoutException socketTimeoutException) {
                continue; // continua para a proxima iteração para continuar ouvindo
            } catch (IOException ioException) {
                ioException.printStackTrace();
                break;
            }
        }


    }
  

    /** 
     * Método usado para enviar mensagens
     */
    private synchronized void sendMessage(String message) {

        byte[] messageBytes = message.getBytes();

        try {
            // cria DatagramSocket para o envio de mensage
            DatagramSocket socket =
                    new DatagramSocket(ServerSettings.porta_envio_multicast);


            InetAddress group = InetAddress.getByName(ServerSettings.endereço_de_multicast);

            // cria pacote para envio
            DatagramPacket packet = new DatagramPacket(messageBytes,
                    messageBytes.length, group, ServerSettings.porta_recebimento_multicast);

            socket.send(packet); // manda o pacote
            socket.close(); // fecha socket
        } catch (IOException ioException) {
            JOptionPane.showMessageDialog(null, "Problema ao enviar mensagem"
                    + "\nProblema:" + ioException.toString());
        }
    }
}
